package com.scw.dao;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
 * dao
 * @author 王华聪
 *
 * @param <T>
 */
public class BasicDao<T extends Serializable> {
	@Autowired
	private static HibernateTemplate hibernateTemplate;
	protected Class<T> model;
	
	public BasicDao(){
	}
	
	public static <T extends Serializable> BasicDao<T> getDao(Class<T> model){
		WebApplicationContext wc=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
		BasicDao<T> dao=(BasicDao<T>) wc.getBean("BasicDao");
		if(model!=null)
			dao.model=model;
		return dao;
	}
	/**
	 * 模糊查找
	 * @param entity
	 * @return
	 */
	public List<T> findall(T entity){
		StringBuffer HQL=new StringBuffer("FROM "+entity.getClass().getName()+" where 1=1 ");
		for(Field f:entity.getClass().getDeclaredFields()){
			f.setAccessible(true);
			try {
				if(f.get(entity)!=null && f.getType().equals(String.class)){
					HQL.append(" and ");
					HQL.append(f.getName()+" like '%"+f.get(entity)+"%'");
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return (List<T>)getHibernateTemplate().find(HQL.toString());
	}
	/**
	 * 准确查找
	 * @param entity
	 * @return
	 */
	public T getBean(T entity){
		StringBuffer HQL=new StringBuffer("FROM "+entity.getClass().getName()+" where 1=1 ");
		for(Field f:entity.getClass().getDeclaredFields()){
			f.setAccessible(true);
			try {
				if(f.get(entity)!=null){
					if(f.getType().equals(String.class))
						HQL.append( "and "+f.getName()+"='"+f.get(entity)+"'");
					else
						HQL.append( "and "+f.getName()+"="+f.get(entity));
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		List<T> list=new ArrayList<T>();
		list=hibernateTemplate.find(HQL.toString());
		if(list.size()==0)
			return null;
		return list.get(0);
	}
	/**
	 * 添加
	 * @param entity
	 * @return
	 */
	public Serializable add(T entity){
		return getHibernateTemplate().save(entity);
	}
	
	/**
	 * ID获取model
	 * @param id
	 * @return
	 */
	public T get(Serializable id){
		return (T)getHibernateTemplate().get(model.getClass(), id);
	}
	/**
	 * 删除
	 * @param id
	 */
	public void del(Long id){
		Object obj=this.get(id);
		hibernateTemplate.delete(obj);
	}
	/**
	 * 更新
	 * @param entity
	 */
	public void update(T entity){
		hibernateTemplate.update(entity);
	}
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
	
}
